import java.io.*;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
public class ServerReader extends Thread {
    private Socket socket;
    private String root = "files"; //存放文件的文件夹名称

    public ServerReader(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            DataInputStream netIn = new DataInputStream(socket.getInputStream());
            //获取客户端发送过来的内容
            String s = netIn.readUTF();
            //获取操作标记
            String flag = s.substring(0, 1);

            switch (flag) {
                //查看可下载清单
                case "1":
                    this.sendFileList();
                    break;
                //上传文件
                case "2":
                    this.uploadFile(s.substring(1));
                    break;
                //下载文件
                case "3":
                    this.downloadFile(s.substring(1));
                    break;
                default:
                    System.out.println("错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 向客户端发送下载文件列表
     */
    private void sendFileList() throws Exception {
        DataOutputStream netOut = new DataOutputStream(socket.getOutputStream());
        System.out.println("服务器：获取文件列表");

        //获取files文件夹下所有的文件名称
        String[] fileArray = new File(root).list();
        StringBuffer buf = new StringBuffer();

        //将所有的文件名称进行拼接，文件名称之间使用符号!进行连接
        for (int i = 0; i < fileArray.length; i++) {
            if (i < fileArray.length - 1) {
                buf.append(fileArray[i]).append("!");
            } else {
                buf.append(fileArray[i]);
            }
        }

        //发送文件列表到客户端
        netOut.writeUTF(buf.toString());
        netOut.flush();
    }

    /**
     * 服务器接收客户端上传文件
     */
    private void uploadFile(String fileName) throws IOException {
        //创建文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream("files/" + fileName);
        DataInputStream netIn = new DataInputStream(socket.getInputStream());

        byte[] buffer = new byte[1024];
        int len;
        //将流中的文件内容写入指定文件中
        while ((len = netIn.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, len);
        }

        //关闭输出流
        fileOutputStream.close();
        DataOutputStream netOut = new DataOutputStream(socket.getOutputStream());
        //向客户端发送上传结果
        netOut.writeUTF("文件上传成功！");
    }

    /**
     * 将服务器对应的文件发送到客户端
     */
    private void downloadFile(String fileName) throws IOException {
        try {
            DataOutputStream netOut = new DataOutputStream(socket.getOutputStream());
            //获取files文件夹下的所有文件名
            String[] fileArray = new File(root).list();
            List<String> list = Arrays.asList(fileArray);

            //如果files文件夹下不包含需要下载的文件名
            if (!list.contains(fileName)) {
                netOut.writeUTF("error");
                netOut.writeUTF("下载列表中没有对应的文件！");
            } else {
                netOut.writeUTF("success");
                //文件下载源路径
                String resourcePath = root + "/" + fileName;
                //文件输入流
                FileInputStream fileInputStream = new FileInputStream(resourcePath);

                byte[] buffer = new byte[1024];
                int len;
                //读取需要下载的文件，并写入到流中
                while ((len = fileInputStream.read(buffer)) != -1) {
                    netOut.write(buffer, 0, len);
                }

                fileInputStream.close();
                netOut.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}